/******************************************************************************
                         COPYRIGHT 1955-2008 by BUPT ISC.
                        北京邮电大学信息安全中心 版权所有
                           Web: http://www.bupt.edu.cn
 *******************************************************************************/
/*******************************************************************************
  文件名： log.h
  项目：   
  模块：   common
  作者：   huangwei
  版本：   0.2
  创建于:  2009-03-20
  描述：
    日志模块主文件

  修改历史： 
  日期：     修改人：     修改描述：
  
 *********************************************************************************/
#ifndef _LOG_H_
#define _LOG_H_

#include <stdio.h>
#include <stdarg.h>
#include <time.h>
#include <malloc.h>
#include <string.h>

#include "defs.h"
#include "appender.h"
#include "conf_helper.h"
#include "sysconfig.h"

#define DEFAULT_AREA_SIZE 10240000 /* 默认日志缓冲区大小：10MB */
#define MAX_MSG_SIZE 512           /* 最大消息长度 */

#ifndef LOGPLACE        /* 定义输出位置，默认输出到错误控制台 */
#define LOGPLACE stderr
#endif

#if LOGDBG
#define logdbg(file, fmt, args...) fprintf(stderr, fmt, ##args)
#else
#define logdbg(file, fmt, args...) do {} while (0)
#endif

/* 需要使用printf()函数时，请用dbgprint宏代替*/
#if defined( _DEBUG_ ) 
#define dbgprint(fmt, args...) fprintf(stderr, fmt, ##args)
#else
#define dbgprint(fmt, args...) do {} while (0)
#endif

/* 日志配置文件参数名 */
#define LOG_LEVEL_KEY STR(LogLevel)
#define LOG_PLACE_KEY STR(LogPlace)
#define LOG_FILE_KEY STR(LogFile)

#define LOG_TIMESTAMP gettimeofday_r()

#define log_r(prio, fmt, args...) _log_r(prio, LOG_LOC_FMT fmt, LOG_TIMESTAMP, LOG_LOC, ##args)

struct LOG_MSG_T {
        short int iPrio;        /* 消息级别 */
        void *pNext;            /* 指向下一条消息的指针 */
        char *pcMsg;            /* 消息字符串 */
};

struct LOG_AREA_T {
        int iEmpty;             /* 消息队列缓冲池是否为空 */
        void *pHead;            /* 消息队列头指针 */
        void *pTail;            /* 消息队列尾指针 */
        void *pStart;           /* 当前消息头指针 */
        void *pEnd;             /* 当前消息尾指针 */
        char *pcBuff;           /* 消息缓冲区 */
};

struct LOG_AREA_T *g_pstLogArea;            /* 日志缓冲区 */

CONFIG_CACHE_T *pstConfigCache;             /* 日志模块配置参数缓存 */

/* 初始化日志线程 */
int initLog (char *progname, int size);

/* 关闭日志线程 */
void closeLog (void);

/* 写日志的主调函数*/
void _log_r(int iPrio, char * fmt, ...);

/* 消息入日志队列 */
int enLogQueue (int prio, const char *fmt, va_list ap);

/* 消息出日志队列 */
int deLogQueue (void *);

/* 写消息到系统日志 */
void logSyslog (void *);

/* dump日志缓冲区内容（调试用） */
void dumpLogarea (void);

/* 清空并释放日志缓冲区内容 */
void freeLogarea (void);

/* 获取系统当前本地时间 */
char *gettimeofday_r();
#endif /* LOG_H */

